package br.com.modelo;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import java.util.List;
import br.com.vo.Usuario;
import br.com.vo.Perfil;
import br.com.vo.Turma;

import br.com.geral.Conexao;

public class UsuarioDAO {
	private Conexao con;
	
	/*
	 * Seta um objeto de conex�o com a base de dados.
	 * */
	public UsuarioDAO(){
		con = Conexao.getInstance();
	}
	
	/*
	 * Realiza uma busca no banco por todos os usu�rios, relacionando seu perfil
	 * e retorna um ArrayList com estes registros
	 * */
	public List buscar(){
		//Monta a query que ser� executada no banco
		String query = "SELECT us.cod_usuario, us.nome, "+
					   "	   pe.cod_perfil, pe.tipo, "+
					   "	   tu.cod_turma, COALESCE(tu.nome, '-')as turma "+
					   "FROM tb_usuarios us"+
					   "	 LEFT JOIN tb_perfis pe ON us.cod_perfil = pe.cod_perfil "+
					   "	 LEFT JOIN tb_turmas tu ON us.cod_turma = tu.cod_turma";
		//Inicializa��o dos objetos que ser�o utilizados no m�todo
		List usuarios = new ArrayList();
		Usuario usuario = null;
		Perfil perfil = null;
		Turma turma = null;
		//Realiza a busca no banco passando como par�metro a query montada previamente
		ResultSet rs = con.getSelect(query);
		try{
			//Percorre o resultado do banco de dados obtido pela query
			while (rs.next()){
				//Cria uma inst�ncia dos objetos necess�rios
				usuario = new Usuario();
				perfil = new Perfil();
				turma = new Turma();
				//Preenche os valores do objeto usu�rio
				usuario.setCodigo(rs.getInt("cod_usuario"));
				usuario.setNome(rs.getString("nome"));
				perfil.setCodigo(rs.getInt("cod_perfil"));
				perfil.setTipo(rs.getString("tipo"));
				usuario.setPerfil(perfil);
				turma.setCodigo(rs.getInt("cod_turma"));
				turma.setNome(rs.getString("turma"));
				usuario.setTurma(turma);
				//Insere o objeto usu�rio no ArrayList
				usuarios.add(usuario);
			}
		}catch(Exception e){}
		return usuarios;
	}

	/*
	 * Busca por um usu�rio no banco de dados de acordo com o c�digo informado e retorna o mesmo
	 * */
	public Usuario buscar(int codigo){
		//Monta a query de busca
		String query = "SELECT us.cod_usuario, us.nome, us.fone, us.login, us.senha, "+
					   "	   pe.cod_perfil "+
					   "FROM tb_usuarios us "+
					   "	 LEFT JOIN tb_perfis pe ON us.cod_perfil = pe.cod_perfil "+
					   "	 LEFT JOIN tb_turmas tu ON us.cod_turma = tu.cod_turma " +
					   "WHERE us.cod_usuario = " + codigo;
		//Inicializa os objetos necess�rios no m�todo
		Usuario usuario = null;
		Perfil perfil = null;
		//Realiza a busca no banco e retorna um objeto com os registros
		ResultSet rs = con.getSelect(query);
		try{
			//Percorre todos os resultados do banco obtidos atrav�s da query
			while (rs.next()){
				//Cria uma nova inst�ncia dos objetos necess�rios
				usuario = new Usuario();
				perfil = new Perfil();
				//Preenche o objeto de retorno
				usuario.setCodigo(rs.getInt("cod_usuario"));
				usuario.setNome(rs.getString("nome"));
				usuario.setFone(rs.getString("fone"));
				usuario.setLogin(rs.getString("login"));
				usuario.setSenha(rs.getString("senha"));
				perfil.setCodigo(rs.getInt("cod_perfil"));
				usuario.setPerfil(perfil);
			}
		}catch(Exception e){}
		//Retorna o objeto do banco
		return usuario;
	}

	/*
	 * Insere um novo usu�rio no banco de dados
	 * */
	public int inserir(Usuario usuario){
		//Monta a query de acordo com os valores passados pelo objeto que
		//chegou por par�metro.
		String query = "INSERT INTO tb_usuarios " +
					   "           (cod_perfil, "+
					   "            nome, fone, login, senha) "+
					   "       VALUES("+
					   usuario.getPerfil().getCodigo() + "," + 
					   "'" + usuario.getNome() + "'," +
					   "'" + usuario.getFone() + "'," +
					   "'" + usuario.getLogin() + "'," +
					   "'" + usuario.getSenha() + "')";
		try{
			//Executa a query e retorna 1 se Ok e 0 se der pau
			return con.getExecute(query);
		}catch(Exception e){
			return 0;
		}
	}
	
	/*
	 * Exclui um usu�rio do banco de dados
	 * */
	public int excluir(Usuario usuario){
		//Monta a query de acordo com o c�digo do objeto passado
		//chegou por par�metro.
		String query = "DELETE FROM tb_usuarios "+
					   "WHERE cod_usuario = " + usuario.getCodigo();
		try{
			//Executa a query e retorna 1 se Ok e 0 se der pau
			return con.getExecute(query); 
		}catch(Exception e){
			return 0;
		}
	}
	
	/*
	 * Realiza update no usu�rio passado como par�metro
	 * */
	public int editar(Usuario usuario){
		//Monta a query de acordo com os valores do objeto que
		//chegou por par�metro.
		String query = "UPDATE tb_usuarios " +
					   "       SET nome=" + "'" + usuario.getNome() + "'," +
					   "           fone=" + "'" + usuario.getFone() + "'," +
					   "		   login=" + "'" + usuario.getLogin() + "'," +
					   "		   senha=" + "'" + usuario.getSenha() + "'," +
					   " 		   cod_perfil=" + "'" + usuario.getPerfil().getCodigo() + "'" +
					   " WHERE cod_usuario = " + usuario.getCodigo();
		try{
			//Executa a query e retorna 1 se Ok e 0 se der pau
			return con.getExecute(query); 
		}catch(Exception e){
			return 0;
		}
	}
	
	/*
	 * Verifica o login e senha do usu�rio e efetua login.
	 * Se retornar um objeto instanciado, significa que o login e senha
	 * foram validados com sucesso. Se retornar null significa que o login
	 * ou senha est�o incorretos
	 * */
	public Usuario efetuarLogin(Usuario usuario){
		//Query que busca o usu�rio pelo login e senha
		String query = "SELECT cod_perfil, nome " +
					   "FROM tb_usuarios " +
					   "WHERE login = '" + usuario.getLogin() + "'" +
					   "      AND senha = '" + usuario.getSenha() +"'";
		//Executa a query de busca
		ResultSet rs = con.getSelect(query);
		usuario = null;
		try{
			while (rs.next()){
				Perfil perfil = new Perfil();
				usuario = new Usuario();
				//Preenche os valores do usu�rio que ser�o necess�rios para a aplica��o
				perfil.setCodigo(rs.getInt("cod_perfil"));
				usuario.setPerfil(perfil);
				usuario.setNome(rs.getString("nome"));
			}
		}catch(Exception e){
			return null;
		}
		return usuario;
	}
}
